#include "circlular_queue.h"
#include <stdlib.h>

#define Q_SIZE 5 // 队列空间

struct queue_t {
  Item contents[Q_SIZE];
  int head;  // 对头
  int tail;  // 队尾
  int items; // 队列中元素的数量
};

cqueue queue_create() {
  cqueue q = malloc(sizeof(struct queue_t));
  if (q == NULL)
    return NULL;

  q->head = q->tail = 0;
  q->items = 0;

  return q;
}

void queue_destory(cqueue q) { free(q); }

//            tail      head
//             ↓ ⇢      ↓ ⇢
//  _______________________________________
// | a5| a6 |    |    | a1 | a2 | a3 | a4 |
// |--------------------------------------|
//   0   1    2    3    4    5    6    7
//
void queue_append(cqueue q, Item val) {
  // 队列满
  if (q->items > 0 && (q->head + q->tail) % Q_SIZE == 0)
    return;

  q->contents[q->tail] = val;
  q->tail = (q->tail + 1) % Q_SIZE;
  ++q->items;
}

// 调用前先检查数据, 确保数据存在
Item queue_remove_head(cqueue q) {
  Item data = q->contents[q->head];
  q->head = (q->head + 1) % Q_SIZE;
  --q->items;

  return data;
}

// 调用前先检查数据, 确保数据存在
Item queue_head(cqueue q) { return q->contents[q->head]; }

// 调用前先检查数据, 确保数据存在
Item queue_last(cqueue q) {
  return q->contents[(q->tail - 1 + Q_SIZE) % Q_SIZE];
}

bool queue_is_empty(cqueue q) { return 0 == q->items; }